package scala.com.shujia.jichu

/**
 * 函数当作返回值返回
 */
object Demo12Fun {
  def main(args: Array[String]): Unit = {

    /**
     * fun1: 参数是String类型，返回值是一个函数（参数是String类型，返回值是Int）
     */
    //定义返回值是函数的函数方式1:
    //    def fun1(s1: String): String => Int = {
    //      def show(s: String): Int = {
    //        s.toInt + s1.toInt
    //      }
    //      show
    //    }

    //定义方式2(是方式1的简化写法):

    /**
     * 方式2这种将参数分开定义，今后调用时可以分开传递，这种做法，在scala中叫做函数柯里化
     *
     * 面试题：什么是函数柯里化？
     *  1、本身是一个数学界的一个名词，本意是原来一次传递多个参数，现在被改成了可以分开传递的形式，这种做法叫做柯里化
     *  2、在scala中体现柯里化，指的是函数的返回值也是一个函数，将来调用时参数可以分开传递。
     *  3、提高了程序的灵活性和代码复用性
     *  4、在scala中也可以通过偏函数实现参数分开传递的功能
     */
    def fun1(s1: String)(s: String): Int = {
      s.toInt + s1.toInt
    }

    //调用函数的返回值是函数的方式1：
    //    val resFun1: String => Int = fun1("1")
    //    val res1: Int = resFun1("1000")
    //    println(res1)

    val resFun1: String => Int = fun1("1")
    val r1: Int = resFun1("11")
    println(r1)
    val r2: Int = resFun1("12")
    println(r2)
    val r3: Int = resFun1("13")
    println(r3)


    //    //调用方式2：
    //    val res2: Int = fun1("1")("1000")
    //    println(res2)

    def function1(s1: String, s2: String): Int = {
      s1.toInt + s2.toInt
    }
    //    val res1: Int = function1("1", "1000")
    //    println(res1)

    /**
     * 偏函数
     */
    val f1: String => Int = function1("1", _)
    val res1: Int = f1("1000")
    val res2: Int = f1("2000")
    val res3: Int = f1("3000")
    println(s"res1:$res1,res2:$res2,res3:$res3")


  }
}
